---
title: ProviderObserver
---

import CodeBlock from "@theme/CodeBlock";
import logger from "!!raw-loader!/docs/concepts/provider_observer_logger.dart";
import { trimSnippet } from "../../../../../src/components/CodeSnippet";

[ProviderObserver] 可以监听ProviderContainer的变更。

要使用它，请扩展ProviderObserver类并重写要使用的方法。

[ProviderObserver] 有三种方法：

- 每次初始化provider时都会调用 `didAddProvider`，并且将值暴露为 `value`。
- 每次销毁provider时都会调用 `didDisposeProvider`。
- 每当provider发出通知时，都会调用 `didUpdateProvider`。

### 用法

[ProviderObserver] 的一个简单用例是通过重写 `didUpdateProvider` 方法来记录provider中的更改。

<CodeBlock>{trimSnippet(logger)}</CodeBlock>

现在，每当我们的provider的值被更新时，记录器都会记录它：

```
I/flutter (16783): {
I/flutter (16783):   "provider": "counter",
I/flutter (16783):   "newValue": "1"
I/flutter (16783): }
```

:::note
对于可变的状态，例如 [StateController] ([StateProvider.state] 的状态)和[ChangeNotifier]， 
新旧值将会是相同的。
:::
since they reference the same `StateController` / `ChangeNotifier`.
由于他们引用了相同的`StateController` / `ChangeNotifier`。

[providerobserver]: https://pub.dev/documentation/riverpod/latest/riverpod/ProviderObserver-class.html
[statecontroller]: https://pub.dev/documentation/riverpod/latest/riverpod/StateController-class.html
[stateprovider.state]: https://pub.dev/documentation/riverpod/latest/riverpod/StateProvider/state.html
[changenotifier]: https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html
